package model

import (
	"ci-control-backend/tools"
	"github.com/pkg/errors"
)

// User 用户信息
type User struct {
	Model    `xorm:"extends"`
	Username string `json:"username,omitempty" xorm:"varchar(32) notnull"`
	Password string `json:"password,omitempty" xorm:"varchar(128) notnull"`
	Email    string `json:"email,omitempty" xorm:"varchar(128) notnull"`
}

// 提供接口实现检验
var _ DBOperations = &User{}

// Insert 插入用户
func (user *User) Insert() (int64, error) {
	hashedPassword, err := tools.Password2Hash(user.Password)
	if err != nil {
		return -1, err
	}
	user.Password = hashedPassword
	return DB.Insert(user)
}

// Update 修改用户信息（不包括密码）
func (user *User) Update() (int64, error) {
	if user.ID == 0 {
		return 0, errors.New("id 为空！")
	}
	user.Password = ""
	return DB.ID(user.ID).MustCols("username", "email").Update(user)
}

// Delete 删除用户
func (user *User) Delete() (int64, error) {
	if user.ID == 0 {
		return 0, errors.New("id 为空！")
	}
	return DB.ID(user.ID).Delete(user)
}

// UpdatePassword 更新用户密码
func (user *User) UpdatePassword(password string) (int64, error) {
	if user.ID == 0 {
		return 0, errors.New("id 为空！")
	}
	hashedPassword, err := tools.Password2Hash(password)
	if err != nil {
		return 0, err
	}
	return DB.Table(User{}).ID(user.ID).Update(User{
		Password: hashedPassword,
	})
}

// GetUserByID 根据用户ID获取用户信息
func GetUserByID(id uint) (*User, error) {
	user := new(User)
	has, err := DB.ID(id).Get(user)
	if err != nil {
		return nil, err
	}
	if !has {
		return nil, nil
	}
	return user, nil
}

// GetUserByUsername 根据用户名获取用户信息
func GetUserByUsername(username string) (*User, error) {
	user := new(User)
	has, err := DB.Where("username = ?", username).Get(user)
	if err != nil {
		return nil, err
	}
	if !has {
		return nil, nil
	}
	return user, nil
}

// ExistUserByID 判断用户是否存在
func ExistUserByID(ID uint) (has bool, err error) {
	return DB.Where("id = ?", ID).Exist(&User{})
}

// ExistUserByName 判断用户是否存在
func ExistUserByName(username string) (has bool, err error) {
	return DB.Where("username = ?", username).Exist(&User{})
}
